﻿#pragma once

#include <xy/solver/integrator.h>

namespace xy
{

namespace solver
{

struct ode
{
    /**
     * @brief 多步方法计算 N 步递推的结果，利用 ClassicRK 计算初值
     *
     * @param[in] f
     * @param[in] G
     * @param[in] Z
     */
    static void solve(funcxxt f, time_grid &G, std::shared_ptr<multi_step> Z);

    /**
     * @brief Runge-Kutta 方法计算 N 步递推的结果
     *
     * @param[in] f
     * @param[in] G
     * @param[in] Z
     * @param[in] extra 是否使用外插法
     */
    static void solve(funcxxt f, time_grid &G, std::shared_ptr<one_step> Z, bool extra);
};

struct pde
{
    /**
     * @brief 常规方法 U'(t) = AU(t) + g(t)
     * MOL 配合 Runge-Kutta 方法求解偏微分方程组
     *
     * @param[in] A
     * @param[in] G
     * @param[in] g
     * @param[in] Z
     */
    static void solve(const math::matxd &A, func1x g, time_grid &G, std::shared_ptr<ESDIRK6> Z);
};

} // namespace solver

} // namespace xy